package com.cxt.vo;

import com.cxt.entity.CarpoolInfo;
import com.cxt.entity.WaypointInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;

/**
 * 拼车信息预览类，展示拼车信息的关键信息
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CarpoolPreviewVo {

    /**
     * 拼车信息ID
     */
    private Long id;

    /**
     * 团长ID
     */
    private Long groupLeaderId;

    /**
     * 标题
     */
    private String title;

    /**
     * 拼车状态（1: 拼车中, 2: 已拼满, 3: 已结束）
     */
    private Integer carpoolStatus;

    /**
     * 途径点信息列表
     */
    private List<WaypointInfo> waypoints;

    /**
     * 预计用时（单位：分钟）
     */
    private Integer estimatedDuration;

    /**
     * 总距离（单位：公里）
     */
    private BigDecimal totalDistance;
    /**
     * 总价（单位：元）
     */
    private BigDecimal totalPrice;

    /**
     * 计划开始时间
     */
    private LocalDateTime plannedStartTime;

    /**
     * 是否包含过路费（0: 否, 1: 是）
     */
    private Boolean includeTollFee;

    /**
     * 乘客数量
     */
    private Integer passengerCount;
    /**
     * 理想人数
     */
    private Integer idealPersonCount;
    /**
     * 标签Tag：
     * 拼车类型：1，人找车  2，车找人
     * 计费方式：1，一口价  2，按公里计费
     * 支付方式：1，团长自付 2，总距离平摊 3，按乘坐公里平摊
     * 是否包含过路费：包含过路费就加包含过路费
     */
    private List<String> tags;
    /**
     * 是否在该拼车里面
     */
    private Boolean isInCarpool;

    /**
     * 静态方法，根据拼车信息和途径点信息组装一个预览
     * @param carpoolInfo 拼车信息
     * @param waypointInfoList 途径点信息列表
     * @return CarpoolPreviewVo 预览信息
     */
    /**
     * 静态方法，根据拼车信息和途径点信息组装一个预览
     * @param carpoolInfo 拼车信息
     * @param waypointInfoList 途径点信息列表
     * @return CarpoolPreviewVo 预览信息
     */
    public static CarpoolPreviewVo fromCarpoolInfoAndWaypoints(CarpoolInfo carpoolInfo, List<WaypointInfo> waypointInfoList, Boolean isInCarpool) {
        // 将途径点按照链表顺序排序
        List<WaypointInfo> sortedWaypoints = sortWaypoints(waypointInfoList);
        // 构建tags
        List<String> tags = new ArrayList<>();

//        // 拼车类型
//        if (carpoolInfo.getCarpoolType() != null) {
//            if (carpoolInfo.getCarpoolType() == 1) {
//                tags.add("人找车");
//            } else if (carpoolInfo.getCarpoolType() == 2) {
//                tags.add("车找人");
//            }
//        }

        // 计费方式
        if (carpoolInfo.getPricingMethod() != null) {
            if (carpoolInfo.getPricingMethod() == 1) {
                tags.add("一口价");
            } else if (carpoolInfo.getPricingMethod() == 2) {
                tags.add("按公里计费");
            }
        }

        // 支付方式
        if (carpoolInfo.getPaymentCalculationMethod() != null) {
            if (carpoolInfo.getPaymentCalculationMethod() == 1) {
                tags.add("团长自付");
            } else if (carpoolInfo.getPaymentCalculationMethod() == 2) {
                tags.add("总距离平摊");
            } else if (carpoolInfo.getPaymentCalculationMethod() == 3) {
                tags.add("按乘坐公里平摊");
            }
        }

        // 是否包含过路费
        if (carpoolInfo.getIncludeTollFee() != null && carpoolInfo.getIncludeTollFee()) {
            tags.add("包含过路费");
        }

//        // 是否直达
//        if (!carpoolInfo.getHasStartDistanceLimit() && !carpoolInfo.getHasEndDistanceLimit()) {
//            tags.add("直达");
//        }

        // 返回构建的CarpoolPreviewVo对象
        return CarpoolPreviewVo.builder()
                //理想人数
                .idealPersonCount(carpoolInfo.getIdealPersonCount())
                .id(carpoolInfo.getId())
                .groupLeaderId(carpoolInfo.getGroupLeaderId())
                .title(carpoolInfo.getTitle())
                .carpoolStatus(carpoolInfo.getCarpoolStatus())
                .waypoints(sortedWaypoints)
                .estimatedDuration(carpoolInfo.getEstimatedDuration())
                .totalDistance(carpoolInfo.getTotalDistance())
                .isInCarpool(isInCarpool)
//                .startDistanceLimit(carpoolInfo.getStartDistanceLimit())
//                .endDistanceLimit(carpoolInfo.getEndDistanceLimit())
                .totalPrice(carpoolInfo.getTotalPrice())
                .plannedStartTime(carpoolInfo.getPlannedStartTime())
                .includeTollFee(carpoolInfo.getIncludeTollFee())
                .passengerCount(carpoolInfo.getPassengerCount())
                .tags(tags)  // Set the tags
                .build();
    }

    /**
     * 根据途径点的 prevWaypointId 和 nextWaypointId 对途径点进行排序
     * @param waypointInfoList 途径点信息列表
     * @return 排序后的途径点信息列表
     */
    private static List<WaypointInfo> sortWaypoints(List<WaypointInfo> waypointInfoList) {
        // 创建一个Map来存储ID到WaypointInfo的映射
        Map<Long, WaypointInfo> waypointMap = new HashMap<>();
        for (WaypointInfo waypoint : waypointInfoList) {
            waypointMap.put(waypoint.getId(), waypoint);
        }

        // 找到起点（没有prevWaypointId的途径点）
        WaypointInfo startWaypoint = null;
        for (WaypointInfo waypoint : waypointInfoList) {
            if (waypoint.getPrevWaypointId() == null) {
                startWaypoint = waypoint;
                break;
            }
        }

        // 如果找不到起点，返回空列表
        if (startWaypoint == null) {
            return Collections.emptyList();
        }

        // 按照顺序排列途径点
        List<WaypointInfo> sortedWaypoints = new ArrayList<>();
        WaypointInfo currentWaypoint = startWaypoint;

        // 循环根据nextWaypointId找出下一个途径点，直到没有下一个途径点
        while (currentWaypoint != null) {
            sortedWaypoints.add(currentWaypoint);
            currentWaypoint = waypointMap.get(currentWaypoint.getNextWaypointId());
        }

        return sortedWaypoints;
    }
}